package java_1_11.interface_test;
/**
 * 业务接口-需要干的事：即买电脑（买电脑是核心业务）
 */
interface ISubject{
    void buyComputer();
}
/**
 * 真实业务类：真实付款买电脑的人
 */
class RealSubject implements ISubject{
    @Override
    public void buyComputer() {
        System.out.println("买个  mac  pro  15寸顶配电脑");
    }
}
/**
 * 代理类：辅助我们买电脑，有买电脑的辅助操作，即买电脑前preHandle()后postHandle()做的事也包含在代理类
 */
class ProxySubject implements ISubject{
    private ISubject realSubject;//真正成交前，买电脑的人也不知道具体哪个代购帮买，代购也不知道具体要帮谁买，所以这块用的是接口，而不是具体哪个子类
    //通过构造方法把真实业务传进来
    public ProxySubject(ISubject realSubject) {
        this.realSubject = realSubject;
    }
    public void preHandle(){
        System.out.println("买票去某地看好电脑");
    }
    @Override
    public void buyComputer() {
        //调用买前操作
        preHandle();
        //付钱这个操作是通过真实业务处理的-真实的付钱人付钱
        this.realSubject.buyComputer();
        //调用买后操作
        postHandle();
    }
    public void postHandle(){
        System.out.println("再买票把电脑带回来");
    }
}
/**
 * 最终通过平台Platform，将代理人和客户产生联系
 * 创建了代理类，在创建了代理类的同时把客户RealSubject就传入了
 */
class Platform{
    //获取
    public static ISubject getInstance() {
        return new ProxySubject(new RealSubject());//在代购平台上下单
    }
}
/**
 * 业务-买电脑
 */
public class Subject {
    public static void main(String[] args) {
        ISubject subject=Platform.getInstance();//取得一个业务的对象
        subject.buyComputer();
    }
}
